Introducción

El presente trabajo se presenta como una continuación y profundización de los Trabajos Prácticos 01 y 02, que se puede encontrar en el siguiente enlace: https://github.com/mlincemarino/mu124tp01 y https://github.com/mlincemarino/mu124tp02.

En cuanto al contenido generado, el mismo no sufrirá grandes variaciones. Sin embargo, se procurará introducir nuevas herramientas visuales que permitan mejores interacciones entre los datos.

basemipieza <- read.csv2("01-Data/MIPIEZA_BASE-FINAL-03.csv", encoding = "UTF-8", header = TRUE) #Acá leemos el csv. 

Repasando, y a modo de resumen, en el ejercicio anterior se realizaron las siguientes acciones sobre la base:

  • Limpiar la base para seleccionar solo aquellas variables de interés.
  • Agrupar las observaciones por provincia y convertir los nombres de los códigos para facilitar su interpretación.
  • Agrupar las observaciones por región y analizar su distribución en torno a los grupos de tratamiento y grupos de control.
  • Analizar la incidencia de cada provincia en el conjunto de los barrios populares.
  • Analizar el peso que tenía cada provincia en el conjunto de personas encuestadas para el estudio de Mi Pieza.
  • Comparar la diferencia entre el porcentaje de mujeres entrevistadas de cad aprovincia y el peso de cada una de estas en el conjunto de barrios populares y personas que residen en los mismos a los fines de entender qué tan representativa era la muestra.

Preguntas a responder

Siguiendo el análisis realizado en el Trabajo Práctico 01, y con el fin de poder empezar a visualizar geográficamente la información, responderemos a la siguiente pregunta de investigación:

  • ¿Hay un balance entre la cantidad de hogares en barrios populares por provincia y la cantidad de sorteadas en cada una?
  • ¿Existe un balance entre la cantidad de mujeres de la muestra en Mi Pieza y la cantidad de hogares que residen en barrios populares por provincia?
  • ¿Existe un balance entre la cantidad de mujeres de la muestra en Mi Pieza y la cantidad de mujeres que salieron sorteadas por provincia?

Para responder a estas preguntas, primero realizaremos una exploración de los datos.

Desarrollo del ejercicio - Parte 01 - Análisis exploratorio y primeras visualizaciones

Importación de la nueva base de datos y exploración de los datos

Para responder a la pregunta, empezaremos por importar la base de datos de barrios populares del Registro Nacional de Barrios Populares. La misma fue descargada del siguiente enlance: https://datosabiertos.desarrollosocial.gob.ar/dataset/registro-nacional-de-barrios-populares el día 17 de septiembre de 2023.

baserenabap <- read.csv2("01-Data/2022-07-13_renabap_base.csv", encoding = "UTF-8", header = TRUE, sep = ",") #Acá leemos el csv. 

Visualicemos la base.

library(dplyr)
library(htmltools)
library(rmarkdown)
library(DT)
# Obtenemos índice de la columna "geometry" a los fines de poder filtrarla del datatable porque, debido a su extensión, complejiza la visualización. 
geometry_index <- which(names(baserenabap) == "geometry")

# Mostrar el datatable excluyendo la columna "geometry"
datatable(baserenabap[, -geometry_index],
  options = list(
    scrollX = TRUE,      # Habilitar scroll horizontal
    pageLength = 10     # Número de filas por página
  )
) %>%
  formatStyle(
    names(baserenabap)[-geometry_index],  # Excluir "geometry" del estilo
    background = 'white',
    fontWeight = 'bold',
    style = 'auto',
    width = '30%',
    height = 17,
    fontSize = '12px'
  )
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html

Como podemos ver, tenemos 5687 filas y 77 columnas / campos.

Selección de variables de interés

En base al trabajo anterior, y considerando que nos importa entender la cantidad de barrios que hay por provincia, haremos un trabajo sobre la base que nos permita quedarnos con las variable que más nos importan.

baserenabap_sel <- select(baserenabap, c("provincia", "cantidad_viviendas_aproximadas", "cantidad_familias_aproximada", "superficie_m2", "personas_genero_masc", "personas_genero_fem", "personas_genero_otrx"))
baserenabap_sel <- baserenabap_sel %>%
  mutate(
    provincia = as.factor(provincia),
    cantidad_viviendas_aproximadas = as.numeric(cantidad_viviendas_aproximadas),
    cantidad_familias_aproximada = as.numeric(cantidad_familias_aproximada),
    superficie_m2 = as.numeric(superficie_m2),
    personas_genero_masc = as.numeric(personas_genero_masc),
    personas_genero_fem = as.numeric(personas_genero_fem),
    personas_genero_otrx = as.numeric(personas_genero_otrx)
  )
baserenabap_prov <- baserenabap_sel %>%
  group_by(provincia) %>%
  summarize(
    cantidad_barrios = n(),
    cantidad_viviendas_aproximadas = sum(cantidad_viviendas_aproximadas, na.rm = TRUE),
    cantidad_familias_aproximada = sum(cantidad_familias_aproximada, na.rm = TRUE),
    superficie_m2 = sum(superficie_m2, na.rm = TRUE),
    personas_genero_masc = sum(personas_genero_masc, na.rm = TRUE),
    personas_genero_fem = sum(personas_genero_fem, na.rm = TRUE),
    personas_genero_otrx = sum(personas_genero_otrx, na.rm = TRUE)
  ) 
summary(baserenabap_sel)
##         provincia    cantidad_viviendas_aproximadas
##  Buenos Aires:1933   Min.   :    2.0               
##  Santa Fe    : 408   1st Qu.:   34.0               
##  Chaco       : 401   Median :   80.0               
##  Misiones    : 375   Mean   :  186.8               
##  Mendoza     : 317   3rd Qu.:  188.0               
##  Tucumán     : 298   Max.   :14000.0               
##  (Other)     :1955   NA's   :1                     
##  cantidad_familias_aproximada superficie_m2     personas_genero_masc
##  Min.   :    2.0              Min.   :    368   Min.   :   0.0      
##  1st Qu.:   37.0              1st Qu.:  17680   1st Qu.:   5.0      
##  Median :   88.0              Median :  44703   Median :  60.0      
##  Mean   :  205.5              Mean   : 103794   Mean   : 176.6      
##  3rd Qu.:  207.0              3rd Qu.: 108778   3rd Qu.: 186.0      
##  Max.   :15400.0              Max.   :9715558   Max.   :7789.0      
##  NA's   :1                                                          
##  personas_genero_fem personas_genero_otrx
##  Min.   :   0.0      Min.   :0.00000     
##  1st Qu.:   5.5      1st Qu.:0.00000     
##  Median :  64.0      Median :0.00000     
##  Mean   : 191.2      Mean   :0.08475     
##  3rd Qu.: 200.0      3rd Qu.:0.00000     
##  Max.   :8724.0      Max.   :9.00000     
## 

A modo de prueba, visualizaremos el resumen de otra manera con la librería DT.

library(DT) #Instalamos DT para probar otra manera de visualizar el resumen
resumen <- summary(baserenabap_sel)

datatable(resumen, 
          options = list(dom = 't', pageLength = 5, paging = TRUE, searching = FALSE),
          rownames = FALSE)

Tenemos la nueva base con la misma cantidad de observaciones y solo 8 variables. Vamos a proceder a agruparlas por provincia:

Veamos cómo se ve esta nueva base:

paged_table(baserenabap_prov, options(rows.print=25, cols.print=9)) #Visualizamos el archivo con la función "paged_table". 

Visualización gráfica de los datos del RENABAP

Ahora veremos lo anterior gráficamente.

library(tidyverse)
library(geoAr)
arg_geom <- get_geo(geo = "ARGENTINA", level = "provincia") #Me descargo elemento "Argentina" de "get_geo".
ggplot(arg_geom) +
  geom_sf()

library(geofacet)
## rgeos version: 0.6-4, (SVN revision 699)
##  GEOS runtime version: 3.11.0-CAPI-1.17.0 
##  Please note that rgeos will be retired during October 2023,
## plan transition to sf or terra functions using GEOS at your earliest convenience.
## See https://r-spatial.org/r/2023/05/15/evolution4.html for details.
##  GEOS using OverlayNG
##  Linking to sp version: 2.0-0 
##  Polygon checking: TRUE
# 1. Cambiar el nombre de la variable de "codprov_censo" a "provincia" (lo dejo de backup)
arg_geom <- arg_geom %>%
  rename(provincia = codprov_censo)

# 2. Convertir los códigos según el listado proporcionado
codigo_conversion <- c("02" = "CABA", "06" = "BUENOS AIRES", "10" = "CATAMARCA",
                        "14" = "CORDOBA", "18" = "CORRIENTES", "22" = "CHACO",
                        "26" = "CHUBUT", "30" = "ENTRE RIOS", "34" = "FORMOSA",
                        "38" = "JUJUY", "42" = "LA PAMPA", "46" = "LA RIOJA",
                        "50" = "MENDOZA", "54" = "MISIONES", "58" = "NEUQUEN",
                        "62" = "RIO NEGRO", "66" = "SALTA", "70" = "SAN JUAN",
                        "74" = "SAN LUIS", "78" = "SANTA CRUZ", "82" = "SANTA FE",
                        "86" = "SANTIAGO DEL ESTERO", "90" = "TUCUMAN",
                        "94" = "TIERRA DEL FUEGO")

arg_geom <- arg_geom %>%
  mutate(provincia = codigo_conversion[provincia])

Ahora que tenemos el mapa de Argentina dividido en provincias y modificado el código de provincia, incluiremos la cantidad de barrios populares que hay en cada uno. Primero modificaremos el valor de cada dato en la base de RENABAP (baserenabap_prov) a los fines de hacerlo compatible con la forma exacta en que se nombran las provincias en geoAr.

baserenabap_prov <- baserenabap_prov %>%
    mutate(provincia = ifelse(provincia == "Ciudad Autónoma de Buenos Aires", "CABA", toupper(provincia)))
library(stringi)
baserenabap_prov <- baserenabap_prov %>%
  mutate(
    # Quitar acentos y caracteres especiales sin afectar los espacios
    provincia = gsub("[^a-zA-Z0-9 ]", "", stri_trans_nfkd(provincia)),
    provincia = toupper(provincia)  # Convertir a mayúsculas
  )

Ahora sí podemos unir las bases.

mapa_completo <- arg_geom %>%
  right_join(baserenabap_prov, by = "provincia")

Uso de ggplot

Visualicemos la información.

library(ggnewscale)
library(ggplot2)
ggplot(mapa_completo) +
  geom_sf(aes(fill = cantidad_barrios), color = "#8a8a8a") +
  labs(subtitle = "Cantidad de BP por provincia") +
  scale_fill_gradient2(
    low = "#fbffff",
    mid = "#539bca",
    high = "#00628d",
    midpoint = 1000,
    space = "Lab",
    na.value = "grey50",
    guide=guide_legend(direction='horizontal', title.position='top', title.hjust=.5, label.hjust = .5, keywidth = 1, keyheight = 1),
    aesthetics = "fill") +
  geom_sf_label(aes(label = paste0(cantidad_barrios)), size = 2.5) + 
  theme_light() +
  theme(title = element_text(face = 'bold'),
        legend.position = 'bottom')
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

Como podemos ver, la provincia de Buenos Aires es la que más barrios popualres tiene (casi quintuplicanodo la cantidad de barrios respecto de las provincias que le siguen en orden). Ahora veremos el mismo mapa pero con el porcentaje de viviendas que hay en barrios populares en cada provincia por sobre el total.

Primero realizaremos un mapa transformando datos para buscar acrecentar la diferencia en colores entre las provincias:

# Crear el mapa
# Calcular el porcentaje de viviendas por provincia y otras variables
mapa_completo$porcentaje_viviendas <- round((mapa_completo$cantidad_viviendas_aproximadas / sum(mapa_completo$cantidad_viviendas_aproximadas)) * 100,2)
mapa_completo$porcentaje_barrios <- round((mapa_completo$cantidad_barrios / sum(mapa_completo$cantidad_barrios)) * 100,2)
mapa_completo$porcentaje_superf <- round((mapa_completo$superficie_m2 / sum(mapa_completo$superficie_m2)) * 100,2)

library(ggplot2)

# Aplicar transformación logarítmica
mapa_completo$log_porcentaje_viviendas <- log2(mapa_completo$porcentaje_viviendas)

# Crear el gráfico
mapa_completo_plot <- ggplot(mapa_completo) +
  geom_sf(aes(fill = log_porcentaje_viviendas), color = "#8a8a8a") +
  labs(subtitle = "Porcentaje de Viviendas en BP - Opc. 01") +
  scale_fill_gradient2(
    low = "#fbffff",
    mid = "#bae0fc",
    high = "#00628d",
    midpoint = 0.5,  # El punto medio en la escala logarítmica
    space = "Lab",
    na.value = "grey50",
    guide = guide_legend(direction = 'horizontal', 
                        title.position = 'top', 
                        title.hjust = 0.5, 
                        label.hjust = 0.5, 
                        keywidth = 1, 
                        keyheight = 1),
    aesthetics = "fill"
  ) +
  geom_sf_label(aes(label = paste0(round(porcentaje_viviendas, 2), "%")), size = 2.5) + 
  theme_light() +
  theme(title = element_text(face = 'bold'),
        legend.position = 'bottom')

mapa_completo_plot
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

Ahora intentaremos visualizarlo otra vez usando breaks.

# Crear el mapa
ggplot(mapa_completo) +
  geom_sf(aes(fill = porcentaje_viviendas), color = "#8a8a8a") +
  labs(subtitle = "Porcentaje de Viviendas en BP por Provincia - Opc. 02") +
  scale_fill_distiller(
    palette = "Blues",
    breaks = c(0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 6, 7, 8, 9, 10),
    trans = 'log2',
    direction = 1,
    guide = guide_legend(
      direction = 'horizontal',
      title.position = 'top',
      title.hjust = .5,
      label.hjust = .5,
      keywidth = 1,
      keyheight = 1
    )
  ) +
  geom_sf_label(aes(label = paste0(round(porcentaje_viviendas, 2), "%")), size = 2.3) +  # Mostrar porcentaje con etiquetas
  theme_light() +
  theme(
    title = element_text(face = 'bold'),
    legend.position = 'bottom'
  )
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

Tras varios intentos, ambas opciones arrojan buenos resultados en términos visuales. Esto llevó su tiempo, pero permitió entender que es posible tanto transformar las escalas (log2) como generar quiebres en forma manual para lograr corregir la doble complejidad que tiene esta base, al tener valores extremos: el superior, que es la Provincia de Buenos Aires, es siete veces más grande que el segundo valor; como en el inferior, que es La Pampa, que obligó a agregar un decimal más en el redondeo de manera de no obtener un valor nulo (0.0).

Como podemos ver, el 49,11% de las viviendas en barrios populares están ubicadas en Buenos Aires. Además, podemos corroborar que la problemática se concentra en solo 5 provincias. A modo de desafío, resta entender cómo hacer para que el valor de La Pampa no quede en gris tras la transformación logarítmica de los datos, que fue necesaria para poder ver los valores más marcados con la paleta elegida. Este problema surge de que todos los valores se encuentren en un rango chico (0,01% a 7% aprox) y que haya un solo valor extremo (Buenos Aires, con más del 49%).

Ahora veamos el listado de las provincias ordenadas según esta variable:

# Crear la tabla resumen
tabla_resumen <- mapa_completo %>%
  select(provincia, cantidad_barrios, porcentaje_viviendas) %>%
  arrange(desc(porcentaje_viviendas))

# Mostrar la tabla resumen con paged_table
tabla_resumen %>%
  paged_table(options(rows.print = 25))

En función de esto es posible empezar a identificar algunos datos llamativos:

  • CABA tiene solo 50 barrios pero concentra el 7% de las viviendas en barrios populares. - Mendoza tiene varios barrios (317) pero solo tiene el 2,2% de las viviendas en barrios populares.
  • Buenos Aires concentra bastante menos que la mitad de barrios populares. Sin embargo, tiene casi la mitad de las viviendas del país en barrios populares.
  • Es probable que la situación de CABA y Buenos Aires se da a la alta concentración de barrios populares densos que tiene el Área Metropolitana de Buenos Aires.

Visualización con ggplot

A los fines de ver gráficamente la comparación de la cantidad de barrios por provincia, haremos un gráfico de barras.

ggplot(mapa_completo)+
  geom_bar(aes(x=provincia, weight=cantidad_barrios), fill="#00628d")+
  labs(title="Cantidad de Barrios Populares por Provincia",
       y="Cantidad de Barrios populares por provincia",
       x="Provincia",
       caption="Fuente: datos provistos RENABAP")+
  geom_label(aes(x=provincia, y=cantidad_barrios, label=as.numeric(round(cantidad_barrios,1))), size = 3.5, label.size =0.5, nudge_y = 50)+
  coord_flip()+
  theme_light()

Visualización en geofacet

Ahora analizaremos esto en geofacet.

library(geofacet)
grid_preview(argentina_grid2)
## Note: You provided a user-specified grid. If this is a generally-useful
##   grid, please consider submitting it to become a part of the geofacet
##   package. You can do this easily by calling:
##   grid_submit(__grid_df_name__)

# COMANDOS EMPATAR NOMBRES DE DISTRITOS DE GRILLA (geofacet) Y BASE DE DATOS
argentina_grid2 <-  data.frame(
  col = c(1, 3, 5, 1, 2, 1, 3, 4, 2, 2, 4, 1, 3, 3, 4, 1, 2, 2, 1, 1, 2, 1, 1, 1),
  row = c(1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 9, 10),
  code = c("AR-Y", "AR-P", "AR-N", "AR-A", "AR-T", "AR-K", "AR-H", "AR-W", "AR-G", "AR-X", "AR-E", "AR-F", "AR-S", "AR-B", "AR-C", "AR-J", "AR-D", "AR-L", "AR-M", "AR-Q", "AR-R", "AR-U", "AR-Z", "AR-V"),
  name_prov = c("JUJUY", "FORMOSA", "MISIONES", "SALTA", "TUCUMAN", "CATAMARCA", "CHACO", "CORRIENTES", "SANTIAGO DEL ESTERO", "CORDOBA", "ENTRE RIOS", "LA RIOJA", "SANTA FE", "BUENOS AIRES", "CABA", "SAN JUAN", "SAN LUIS", "LA PAMPA", "MENDOZA", "NEUQUEN", "RIO NEGRO", "CHUBUT", "SANTA CRUZ", "TIERRA DEL FUEGO"),
  stringsAsFactors = FALSE
)
# Renombrar la columna "provincia" a "name_prov"
names(mapa_completo)[names(mapa_completo) == "provincia"] <- "name_prov"
library(tidyr)
# Seleccionar solo las columnas de interés
mapa_completo_largo <- mapa_completo %>%
  select(name_prov, porcentaje_barrios, porcentaje_viviendas, porcentaje_superf) %>%
  gather(variable, porcentaje, porcentaje_barrios:porcentaje_superf)
# Crear una nueva variable para indicar si es Buenos Aires o no
mapa_completo_largo <- mapa_completo_largo %>%
  mutate(hjust_buenosaires = ifelse(name_prov == "BUENOS AIRES", 1.2, -0.2))

# Crear el gráfico
ggplot(mapa_completo_largo, aes(variable, porcentaje, fill = variable)) +
  geom_col() +
  geom_text(aes(label = paste0(porcentaje, "%"), 
                y = porcentaje, 
                hjust = hjust_buenosaires),
            size = 3.5) +  # Agregar etiquetas de texto con los porcentajes
  coord_flip() +
  theme_bw() +
  facet_geo(~ name_prov, grid = argentina_grid2) +
  scale_y_continuous(expand = c(0, 0)) +
  labs(title = "Distribución de las variables por provincia",
       caption = "Fuente: elab. propia con datos RENABAP",
       x = NULL, 
       y = "Porcentaje") +
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        strip.text.x = element_text(size = 8),
        legend.text = element_text(size = 9),  # Ajustar tamaño de texto de la leyenda
        legend.title = element_text(size = 9)) +  # Ajustar tamaño del título de la leyenda
  guides(fill = guide_legend(title = "Variable", label.theme = element_text(size = 9)))  # Ajustar tamaño del texto en la guía
## Note: You provided a user-specified grid. If this is a generally-useful
##   grid, please consider submitting it to become a part of the geofacet
##   package. You can do this easily by calling:
##   grid_submit(__grid_df_name__)

Como podemos observar, algunas provincias presentan diferencias considerables respecto de su participación en cada una de las variables. A continuación se detallan algunos casos particulares:

  • CABA tiene un 7% de las viviendas totales y sus BP solo representan 0,5% de la superficie total de BP en el país.
  • Misiones tiene un 8,8% de la superficie total de BP en el país, siendo la segunda provincia luego de Buenos Aires, pero solo un 4,8% del total de las viviendas en BP del país se encuentran allí.
  • Buenos Aires destaca en todas las categorías, aunque con cierta dispersión. Más del 49% de las viviendas ubicadas en BP del país se encuentran en esta provincia, pero representa el 34% de los barrios a nivel país.

Uso de leatflet (VIZ)

Ahora veremos el mapa de un modo interactivo. Para ello, haremos varios análisis según categorías distintas:

Relación de hogares por superficie

Se utilizará, a modo de proxy de densidad y hacinamiento, la relación entre la superficie y la cantidad de hogares a nivel promedio por BP.

Primero deberemos crear un nuevo campo.

# Calcula la relación entre superficie_m2 y cantidad_hogares cada 1 km²
mapa_completo$viviendas_por_km2 <- round(mapa_completo$cantidad_viviendas_aproximadas / (mapa_completo$superficie_m2 / 1000000),2)

Ahora activamos las librerías que usaremos:

library(sf)
## Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
library(leaflet) #Activamos librerías

Haremos un leaflet para ver cómo se ve el mapa analizado desde esta dimensión:

mapa_completo_mapageo <- st_as_sf(mapa_completo)

pal_km2 <- colorQuantile("Blues", domain = mapa_completo_mapageo$viviendas_por_km2, n = 10)

leaflet(st_zm(mapa_completo_mapageo) %>% st_transform(4326)) %>%
  addTiles() %>%
  addProviderTiles(providers$CartoDB.Positron, group = "OSM",
                   options = providerTileOptions(minzoom = 1, maxzoom = 15)) %>%
  addLayersControl(
    baseGroups = c("OSM", "Satelite"),
    overlayGroups = c("Cant. viviendas por km2"),
    options = layersControlOptions(collapsed = FALSE)) %>%
   addPolygons(data = (st_zm(mapa_completo_mapageo) %>% st_transform(4326)),
              fillColor = ~pal_km2(viviendas_por_km2),
              weight = 1,
              color = "black",
              fillOpacity = 0.7,
              popup = ~paste("<strong> Provincia: </strong>", name_prov, "<br> <strong> Cantidad de viviendas en BP por km2: </strong>", viviendas_por_km2),
              group = "Cant. viviendas por km2") %>%
  addPolygons(data = (st_zm(mapa_completo_mapageo) %>% st_transform(4326)),
              fillColor = "white",
              weight = 1,
              color = "black",
              fillOpacity = 0.5) %>%
  hideGroup("Cant. viviendas por km2")
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Blues is 9
## Returning the palette you asked for with that many colors

Como podemos observar, los colores más fuertes, que responden a un mayor número de viviendas por km2 en barrios populares, se concentran en el norte del país, además de la provincia de Buenos Aires y CABA, que junto a Jujuy y Santa Fe son las que lideran el ranking.

Estos valores se pueden considerar un buen proxy de densidad y hacinamiento dentro de los barrios populares de cada provincia. Como vemos, mientras más al sur nos encontramos, menor es la densidad. Si esta variable fuera un proxy de complejidad de re-urbanización o intervención orientada a la integración urbana, las provincias en tonos más oscuros indicarían mayor complejidad.

Veamos estos valores en forma de tabla ordenados de mayor a menor.

# Creamos una tabla interactiva
datatable(mapa_completo_mapageo[, c("name_prov", "viviendas_por_km2")],
          options = list(pageLength = 24))  # Ajustamos el número de filas por página según sea necesario

Como podemos observar, CABA tiene una densidad de viviendas por km2 amoliamente superior a la segunda provincia (Jujuy), lo que da la pauta de que son barrios populares altamente densificados y con probabilidad alta de hacinamiento.

Cantidad y Porcentaje de Barrios Populares por Provincia sobre Total País

Ahora visualizremos la cantidad de barrios populares por provincia y el porcentaje que representa cada una de ellas sobre el total país.

qpal_barrioscant <- colorQuantile("Blues", domain = mapa_completo_mapageo$cantidad_barrios, n = 10)
qpal_barriosporc <- colorQuantile("Blues", domain = mapa_completo_mapageo$porcentaje_barrios, n = 10)

leaflet(st_zm(mapa_completo_mapageo) %>% st_transform(4326)) %>%
  addTiles() %>%
  addProviderTiles(providers$CartoDB.Positron, group = "OSM",
                   options = providerTileOptions(minzoom = 1, maxzoom = 15)) %>%
  addLayersControl(
    baseGroups = c("OSM", "Satelite"),
    overlayGroups = c("Cant. BP por Provincia", "Porcentaje BP sobre Total País"),
    options = layersControlOptions(collapsed = FALSE)) %>%
  addPolygons(data = (st_zm(mapa_completo_mapageo)%>% st_transform(4326)),
              fillColor = ~qpal_barrioscant(cantidad_barrios),
              weight = 1,
              color = "black",
              fillOpacity = 0.7,
              popup = ~paste("<strong> Provincia: </strong>", name_prov, "<br> <strong> Cantidad BP en la provincia: </strong>", cantidad_barrios),
              group = "Cant. BP por Provincia") %>%
  addPolygons(data = (st_zm(mapa_completo_mapageo) %>% st_transform(4326)),
              fillColor = ~qpal_barriosporc(porcentaje_barrios),
              weight = 1,
              color = "black",
              fillOpacity = 0.7,
              popup = ~paste("<strong> Provincia: </strong>", name_prov, "<br> <strong> Porcentaje BP sobre Total País: </strong>", porcentaje_barrios, "%"),
              group = "Porcentaje BP sobre Total País") %>%
  addPolygons(data = (st_zm(mapa_completo_mapageo) %>% st_transform(4326)),
              fillColor = "white",
              weight = 1,
              color = "black",
              fillOpacity = 0.5) %>%
  hideGroup("Cant. BP por Provincia") %>%
  hideGroup("Porcentaje BP sobre Total País")
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Blues is 9
## Returning the palette you asked for with that many colors

## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Blues is 9
## Returning the palette you asked for with that many colors

Tras realizar una exploración profunda de los datos, comenzaremos a elaborar conclusiones preliminares que permitan responder a las preguntas

A continuación, introduciremos las modificaciones necesarias sobre la variable “V3”, que es “provincia”, de acuerdo al diccionario ya citado en el TP N°1 y que se encuentra disponible en la carpeta 00-Data.

basemipieza$V3 <- as.integer(basemipieza$V3) #Convertimos a integer.
#Cambiamos los nombres de las columnas
basemipieza <- mutate(basemipieza, V3=case_when(
    V3 == 1 ~ "BUENOS AIRES", 
    V3 == 2 ~ "CABA",
    V3 == 3 ~ "CATAMARCA",
    V3 == 4 ~ "CHACO",
    V3 == 5 ~ "CHUBUT",
    V3 == 6 ~ "CORDOBA",
    V3 == 7 ~ "CORRIENTES",
    V3 == 8 ~ "ENTRE RIOS",
    V3 == 9 ~ "FORMOSA",
    V3 == 10 ~ "JUJUY",
    V3 == 11 ~ "LA PAMPA",
    V3 == 12 ~ "LA RIOJA",
    V3 == 13 ~ "MENDOZA",
    V3 == 14 ~ "MISIONES",
    V3 == 15 ~ "NEUQUEN",
    V3 == 16 ~ "RIO NEGRO",
    V3 == 17 ~ "SALTA",
    V3 == 18 ~ "SAN JUAN",
    V3 == 19 ~ "SAN LUIS",
    V3 == 20 ~ "SANTA CRUZ",
    V3 == 21 ~ "SANTA FE",
    V3 == 22 ~ "SANTIAGO DEL ESTERO",
    V3 == 23 ~ "TIERRA DEL FUEGO",
    V3 == 24 ~ "TUCUMAN"))

Vamos a agrupar los valores por provincia.

basemipieza_prov <- basemipieza %>%
  group_by(V3) %>%
  summarize(
    cantidad_encuestadas = n(),
    porcentaje_encuestadas = round((n() / nrow(basemipieza)) * 100,2) #Sumamos un campo que sea el porcentaje de encuestadas sobre la base por provincia. 
  )

Ahora realizaremos un gráfico de barras para visualizar esto.

ggplot(basemipieza_prov)+
  geom_bar(aes(x=V3, weight=porcentaje_encuestadas), fill="#00628d")+
  labs(title="% de encuestadas por provincia",
       element_text(size = 12),
       y="Porcentaje de mujeres encuestadas por provincia",
       x="Provincia",
       caption="Fuente: elaboación propia")+
  geom_label(aes(x=V3, y=porcentaje_encuestadas, label=as.numeric(round(porcentaje_encuestadas,1))), size = 3.5, label.size =0.5, nudge_y = 1.5)+
  coord_flip()+
  theme_light()

Ahora realizaremos esta comparación a nivel gráfico sobre un mapa. Primero creamos un ggplot geográfico con estos valores. Para ello, primero uniremos esta variable a la base de mapa_completo con right_join.

basemipieza_prov <- basemipieza_prov %>%
  rename(provincia = V3) #Convertimos en provincia el valor V3.
mapa_mipieza <- arg_geom %>%
  right_join(basemipieza_prov, by = "provincia")
# Aplicar transformación logarítmica
mapa_mipieza$log_porcentaje_encuestadas <- log2(mapa_mipieza$porcentaje_encuestadas)

# Crear el gráfico
mapa_mipieza_plot <- ggplot(mapa_mipieza) +
  geom_sf(aes(fill = log_porcentaje_encuestadas), color = "#8a8a8a") +
  labs(subtitle = "% de Encuestadas por Provincia") +
  scale_fill_gradient2(
    low = "#fbffff",
    mid = "#bae0fc",
    high = "#00628d",
    midpoint = 0.5,  # El punto medio en la escala logarítmica
    space = "Lab",
    na.value = "grey50",
    guide = guide_legend(direction = 'horizontal', 
                        title.position = 'top', 
                        title.hjust = 0.5, 
                        label.hjust = 0.5, 
                        keywidth = 1, 
                        keyheight = 1),
    aesthetics = "fill"
  ) +
  geom_sf_label(aes(label = paste0(round(porcentaje_encuestadas, 2), "%")), size = 2.5) + 
  theme_light() +
  theme(title = element_text(face = 'bold'),
        legend.position = 'bottom')

mapa_mipieza_plot
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

require(gridExtra)
## Loading required package: gridExtra
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
plot01 <- grid.arrange(mapa_mipieza_plot, mapa_completo_plot, nrow = 1)
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data

A nivel gráfico, la comparación no muestra grandes desfasajes. Pero veamos esto con valores numéricos. Para ello, haremos una comparación simple a partir de la diferencia entre los valores.

mapa_completo$diferencia <- mapa_mipieza$porcentaje_encuestadas - mapa_completo$porcentaje_viviendas

Veamos ahora gráficamente esta diferencia.

barras_dif <- ggplot(mapa_completo)+
  geom_bar(aes(x=name_prov, weight=diferencia), fill="#16425b")+
  labs(title="Diferencia de la participación entre % encuestadas y % viviendas por provincia ",
       y="Diferencia entre categoría 'porcentaje_encuestadas' y 'porcentaje_viviendas' (pp)",
       x="Provincia",
       caption="Fuente: elaboración propia")+
  geom_label(aes(x=name_prov, y=diferencia, label=as.numeric(round(diferencia,1))), size = 4, nudge_y = 0.5)+
  coord_flip()+
  theme_light()

barras_dif

Conclusiones preliminares

Como podemos ver, la mayoría de las provincias registran diferencias muy chicas (menos de 2 pp). Solo en dos casos (CABA y Buenos Aires) se identifica una mayor diferencia:

  • En el caso de CABA, la diferencia es en favor del porcentaje de viviendas en Barrios Populares sobre el total país, lo que indica que se encuestaron a menos mujeres en relación a la cantidad de viviendas que tiene dicha jurisdicción a nivel nacional.
  • En el caso de la provincia de Buenos Aires, la diferencia es en favor del porcentaje de encuestadas sobre el total país, lo que indica que se encuestaron a más mujeres en relación a la cantidad de viviendas que tiene dicha jurisdicción a nivel nacional.

Nota aclaratoria: Es importante entender que la comparación que a nivel metodológico más valor tendría sería contra la propia base de inscriptas al Programa, lo que se desarrollará el apartado subsiguiente, dado que el objetivo de este Trabajo Práctico fue aprovechar la oportunidad para lograr hacer un análisis exploratorio de los datos que sirven para entender el contexto de la intervención.

Desarrollo del ejercicio - Parte 02 - Visualizaciones interactivas

Para responder las restantes preguntas, realizaremos un trabajo más exhaustivo sobre la información disponible y utilizaremos nuevas herramientas de visualización.

En primer lugar, instalamos y llamamos tres liberías nuevas (ggiraph, ggtext y cowplot).

library(ggiraph)
library(ggtext)
library(cowplot)
## 
## Attaching package: 'cowplot'
## The following object is masked from 'package:lubridate':
## 
##     stamp

A continuación, se creará un gráfico de barras con interacciones, que denominaremos “barras_interactivo”.

barras_interactivo <- ggplot(mapa_completo)+
  geom_bar(aes(x=name_prov, weight=diferencia), fill="#16425b")+
  labs(title="Diferencia de la participación e/ % encuestadas y % viviendas por provincia ",
       y="Diferencia entre categoría 'porcentaje_encuestadas' y 'porcentaje_viviendas' (pp)",
       x="Provincia",
       caption="Fuente: elaboración propia")+
  geom_label(label = "Provincia", aes(x=name_prov, y=diferencia, size = 4, nudge_y = 0.5))+
  coord_flip()+
  theme_light()+
  ggtitle("Diferencia de la participación e/ % encuestadas y % viviendas por provincia ") +
  theme(plot.title = element_text(size = 10))  # Ajusta el tamaño del título aquí
## Warning in geom_label(label = "Provincia", aes(x = name_prov, y = diferencia, :
## Ignoring unknown aesthetics: nudge_y
barras_interactivo <- ggplotly(barras_interactivo) #Configurar etiquetas una vez que funcione
## Warning in geom2trace.default(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabel() has yet to be implemented in plotly.
##   If you'd like to see this geom implemented,
##   Please open an issue with your example code at
##   https://github.com/ropensci/plotly/issues
barras_interactivo 

Corroboramos que funciona. Además, se corrobora su uso interactivo para descargar parte de la información como PNG luego de seleccionarla con las múltiples funciones que presenta este tipo de herramientas (box select, lasso select, etc).

Ahora buscaremos hacerlo interactuar con el mapa “mapa_mipieza_plot”, al que primero haremos interactivo.

# Calcular la línea de regresión en función de la variable 'diferencia'
linea_regresion <- lm(diferencia ~ cantidad_barrios, data = mapa_completo)

# Crear el gráfico ggplot con los cambios
graf_diferencia <- ggplot(mapa_completo, aes(x = cantidad_barrios, y = diferencia)) +
  geom_point_interactive(
    stroke = 1,
    alpha = 0.7,
    aes(
      size = cantidad_barrios,
      data_id = name_prov,
      tooltip = paste0(
        name_prov,
        "<br> Diferencia: ", round(diferencia, 2),
        "<br> % de Viviendas en BP: ", round(porcentaje_viviendas, 2),
        "<br> % de Encuestadas: ", round(mapa_mipieza$porcentaje_encuestadas, 2)
      )
    )
  ) +
  geom_abline(intercept = coef(linea_regresion)[1], slope = coef(linea_regresion)[2], linetype = "dashed", color = "gray") +
  scale_x_continuous(
    name = "Cantidad de barrios populares en la provincia",
    labels = scales::number_format(),
    breaks = seq(0, max(mapa_completo$cantidad_barrios), by = 50)
  ) +
  scale_y_continuous(
    name = "Diferencia entre % de mujeres encuestadas y % de viviendas en BP en cada provincia",
    labels = scales::percent_format()
  ) +
  theme_minimal() +
  theme(
    plot.subtitle = element_markdown(size = 10),
    plot.title = element_markdown(size = 14),
    legend.position = "none",
    axis.text.x = element_text(size = 4),
    axis.text.y = element_text(size = 4)
  )+
  scale_fill_distiller(
    palette = "Blues")+
  labs(title = "Análisis de representatividad de la muestra",
       subtitle = "Diferencia entre porcentaje de mujeres encuestadas sobre porcentaje de viviendas en BP en cada provincia.")

mapa_mipieza_plot_interactivo <- ggplot(mapa_mipieza) +
  geom_sf(data=arg_geom, aes(geometry=geometry), color = "#8a8a8a", size=.1, alpha=.1) +
  labs(subtitle = "% de Encuestadas por Provincia") +
  scale_fill_gradient2(
    low = "#fbffff",
    mid = "#bae0fc",
    high = "#00628d",
    midpoint = 0.5,  # El punto medio en la escala logarítmica
    space = "Lab",
    na.value = "grey50",
    guide = guide_legend(direction = 'horizontal', 
                        title.position = 'top', 
                        title.hjust = 0.5, 
                        label.hjust = 0.5, 
                        keywidth = 1, 
                        keyheight = 1),
    aesthetics = "fill"
  ) + 
  theme_light() +
  theme(title = element_text(face = 'bold'),
        plot.subtitle = element_markdown(size = 10),
        legend.position = 'bottom') +
  geom_sf_interactive(data=arg_geom,aes(tooltip = provincia,
                                   data_id = provincia))

girafe(ggobj = plot_grid(plotlist=list(graf_diferencia, mapa_mipieza_plot_interactivo), ncol=2),
       pointsize=12,
       opts_text(size = 12, family = "Helvetica"),
       width_svg = 12,
       height_svg = 12,
       options = list(
         opts_hover_inv(css = "fill:#bae0fc;stroke:#00628d;r:5pt;")))

El gráfico anterior nos permite visualizar información importante:

  • Las provincias que más diferencia tienen presentan valores extremos en el eje X: CABA, que destaca por ser el valor más extremo en diferencia negativa (eje Y), a la vez que uno de los más chicos en cantidad de barrios populares (eje X). A su vez, la provincia de Buenos Aires tiene un valor extremo para ambos ejes.
  • La mayor cantidad de provincias se encuentran debajo del 0 en el eje Ym, lo que indica que presentan diferencias negativas entre el % de vviviendas en BP de cada provincia y el % de mujeres encuestadas. Es decir, de acuerdo a este análisis estarían siendo subrepresentadas la mayor parte de las provincias.
  • Las provincias que se encuentran entre las de diferencia más positiva (encima del 0 en el eje Y), son a su vez las provincias con más cantidad de barrios populares, dado que se encuentran a la derecha del eje X.

A pesar de las interpretaciones y conclusiones preliminares, resta analizar los datos a la luz de la relación que hay entre las sorteadas y las encuestadas, dado que puede que el primer desvío tenga lugar en el universo de mujeres que resultaron sorteadas.

Análisis de balance entre cantidad de hogares en BP por provincia, cantidad de inscriptas y cantidad de seleccionadas

Antes de continuar, será necesario contestar la pregunta acerca del balance entre la cantidad de hogares / familias en BP por provincia, la cantidad de inscriptas en el sorteo de Mi Pieza y la cantidad que resultaron seleccionadas en cada una de ellas. Para esto, descargaremos el dataset actualizado del siguiente enlace de datos abiertos: https://datosabiertos.desarrollosocial.gob.ar/dataset/listado-de-participantes-de-los-sorteos-mi-pieza/resource/bb4d6278-b696-4dc5-a5e5-4c5bd08f5301.

En primer lugar, leeremos en R Studio la base.

basemipieza_inscriptas <- read.csv("01-Data/MIPIEZA_INSCRIPTAS.csv", encoding = "UTF-8", header = TRUE) #Acá leemos el csv. 

Realizando una rápida exploración, identificamos que la misma tiene 489.425 observaciones y 16 variables. A grandes rasgos, las mismas contienen información vinculada a:

  • Provincia
  • Barrio Popular (ID)
  • Información sobre el estado de la vivienda (estado de techo, piso y paredes, cantidad ambientes, etc)
  • Información sobre el hogar (cantidad de miembros, presencia de violencia basada en género, etc)
  • Información vinculada al programa (monto solicitado, si salió sorteada y en qué n° se sorteo lo hizo)

En primer lugar, para responder a la pregunta, debemos unificar bases con información disponible. La base a utilizar será “basemipieza_renabap”. Crearemos un conjunto de campos que permita identificar el peso de cada provincia dentro del conjunto de inscriptas. A su vez, analizaremos la cantidad de seleccionadas y de no seleccionadas por provincia.

basemipieza_renabap <- basemipieza_inscriptas %>%
  group_by(provincia) %>%
  summarize(
    inscriptas_totales = n(),
    inscriptas_porc_prov = round(inscriptas_totales / nrow(basemipieza_inscriptas) * 100,2),
    seleccionadas_cant = sum(sorteo %in% c(1, 2, 3, 4, 5, 6, 7, 8)),
    seleccionadas_porc = round(seleccionadas_cant / inscriptas_totales * 100,2),
    no_seleccionadas_cant = inscriptas_totales - seleccionadas_cant, 
    no_seleccionadas_porc = round(no_seleccionadas_cant / inscriptas_totales * 100,2))

basemipieza_renabap <- basemipieza_renabap %>%
  mutate(
    seleccionadas_porc_prov= round((seleccionadas_cant / sum(seleccionadas_cant)) * 100,2))

Visualicemos rápidamente la información resultante:

basemipieza_renabap %>%
  paged_table(options(rows.print = 25, columns.print = 4))

Como podemos ver, solo la provincia de Buenos Aires concentra el 51,29% de las mujeres inscriptas. Sin embargo, estos datos en sí mismo no nos permiten responder la pregunta, dado que debemos cruzar estos valores con otros datos del RENABAP.

Para poder unirlo con “baserenabap_prov”, primero debemos convertir las provincias a mayúscula y modificar la forma de denominar a la Ciudad Autónoma de Buenos Aires.

library(stringi)
basemipieza_renabap <- basemipieza_renabap %>%
  mutate(
    # Quitar acentos y caracteres especiales sin afectar los espacios
    provincia = gsub("[^a-zA-Z0-9 ]", "", stri_trans_nfkd(provincia)),
    provincia = toupper(provincia),  # Convertir a mayúsculas
    provincia = ifelse(provincia == "CIUDAD AUTONOMA DE BUENOS AIRES", "CABA", provincia)
  )

Ahora sí podemos unir las bases:

basemipieza_renabap <- basemipieza_renabap %>%
  right_join(baserenabap_prov, by = "provincia")

Dado que la base permite identificar la cantidad de mujeres y personas no binarias en cada provincia, se considera de valor poder generar este campo adicional que permita estimar el peso de esta población por parte de cada provincia:

basemipieza_renabap <- basemipieza_renabap %>%
  mutate(
    porcentaje_muj_otrx = round(((personas_genero_fem + personas_genero_otrx) / sum(personas_genero_fem + personas_genero_otrx)*100),2),
    porcentaje_barrios = round(cantidad_barrios / sum(cantidad_barrios) * 100,2),
    porcentaje_familias = round(cantidad_familias_aproximada / sum(cantidad_familias_aproximada)*100,2))

Habiendo generado este nuevo campo, que se considera más preciso que la propuesta de análisis anterior (analizar la participación de hogares en BP por provincia), procederemos a realizar un gráfico que permita ver para cada provincia el porcentaje de cada uno. Al igual que antes, primero crearemos una base con las variables de interés.

# Seleccionar solo las columnas de interés
basemipieza_renabap_largo <- basemipieza_renabap %>%
  select(provincia, porcentaje_muj_otrx, inscriptas_porc_prov, seleccionadas_porc_prov) %>%
  gather(variable, porcentaje, porcentaje_muj_otrx:seleccionadas_porc_prov) %>%
  rename(name_prov = provincia)
basemipieza_renabap_largo <- basemipieza_renabap_largo %>%
  mutate(hjust_buenosaires = ifelse(name_prov == "BUENOS AIRES", 1.2, -0.2))

ggplot(basemipieza_renabap_largo, aes(variable, porcentaje, fill = variable)) +
  geom_col() +
  geom_text(aes(label = paste0(porcentaje, "%"), 
                y = porcentaje, 
                hjust = hjust_buenosaires),
            size = 3.5) +  # Agregar etiquetas de texto con los porcentajes
  coord_flip() +
  theme_bw() +
  facet_geo(~ name_prov, grid = argentina_grid2) +
  scale_y_continuous(expand = c(0, 0)) +
  labs(title = "Distribución de las variables por provincia",
       caption = "Fuente: elab. propia con datos RENABAP y Mi Pieza",
       x = NULL, 
       y = "Porcentaje") +
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        strip.text.x = element_text(size = 8),
        legend.text = element_text(size = 8),  # Ajustar tamaño de texto de la leyenda
        legend.title = element_text(size = 8)) +  # Ajustar tamaño del título de la leyenda
  guides(fill = guide_legend(title = "Variable", label.theme = element_text(size = 9)))  # Ajustar tamaño del texto en la guía
## Note: You provided a user-specified grid. If this is a generally-useful
##   grid, please consider submitting it to become a part of the geofacet
##   package. You can do this easily by calling:
##   grid_submit(__grid_df_name__)

Analizando los datos que arroja la base, podemos ver que, en general, la diferencia entre las tres categorías es baja. En caso más extremo, que es Buenos Aires, la diferencia es menor a 2 puntos porcentajes. En base a esta información, se pueden sacar alguans conclusiones preliminares:

  • El alcance del Programa fue homogéneo en todo el territorio nacional desde el momento de la inscripción. Si identificáramos porcentajes desbalanceados entre las provincias, podríamos atribuir dicha diferencia a la falta de difusión o la distinta presencia del Estado en cada una de las provincias. Sin embargo, la escasa diferencia entre los valores “porcentaje_muj_otrx” y “inscriptas_porc_prov” refuta esta teoría.
  • La selección por sorteo fue balanceada también en cada provincia, dado que la diferencia entre las inscriptas de cada provincia y las que resultaron beneficiarias es muy menor. En este sentido, ninguan provincia se encuentra sobrrepresentada.

Ahora visualizaremos estas diferencias en un gráfico de barras para tener datos más específicos.

barras_interactivo_02 <- ggplot(basemipieza_renabap)+
  geom_bar(aes(x=provincia, weight=(porcentaje_familias - seleccionadas_porc_prov)), fill="#16425b")+
  labs(title="Diferencia de la participación e/ % hogares y % seleccionadas por provincia",
       y="Diferencia entre categoría 'porcentaje_familias' y 'seleccionadas_porc_prov' (pp)",
       x="Provincia",
       caption="Fuente: elaboración propia")+
  geom_label(label = "Provincia", aes(x=provincia, y=(porcentaje_familias - seleccionadas_porc_prov), size = 4, nudge_y = 0.5))+
  coord_flip()+
  theme_light()+
  ggtitle("Diferencia de la participación e/ % hogares y % seleccionadas por provincia") +
  theme(plot.title = element_text(size = 10))  # Ajusta el tamaño del título aquí
## Warning in geom_label(label = "Provincia", aes(x = provincia, y =
## (porcentaje_familias - : Ignoring unknown aesthetics: nudge_y
barras_interactivo_02 <- ggplotly(barras_interactivo_02) #Configurar etiquetas una vez que funcione
## Warning in geom2trace.default(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabel() has yet to be implemented in plotly.
##   If you'd like to see this geom implemented,
##   Please open an issue with your example code at
##   https://github.com/ropensci/plotly/issues
barras_interactivo_02

Como podemos ver, las diferencias son muy chicas. A continuación, se describen los valores más extremos:

  • Provincias con diferencia en favor del porcentaje de seleccionadas. Los valores más extremos los presentan la Provincia de Buenos Aires, con 2,42 pp de diferencia, seguida por Corrientes, con 1,35pp.
  • Provincias con diferencia en favor del porcentaje de familias. Los valores más extremos los presentan la Ciudad Autónoma de Buenos Aires (CABA) con 4,35pp, seguida por Tucumán, con 1,14.
  • Provincia sin diferencia. En el caso de Jujuy, la diferencia es de 0,00, aún considerando dos decimales para cada categoría analizada. Esto se constituye en un hallazgo interesante de destacar y que fue analizado tras identificar que en el gráfico, aún con zoom, no se logra identificar una barra.

Análisis de la cantidad de inscriptas y sorteadas por provincia

Dado que lo que nos importa es obtener información agregada por provincia, procederemos a editar la base para hacerla comparable a la que ya tenemos de las encuestadas. Para ello, las agruparemos por provincia y eliminaremos aquellos valores que en “sorteo” tienen un valor vacío, lo que indica que no fueron seleccionadas para recibir el beneficio. Además, luego agregaremos una columna con el porcentaje de cada provincia sobre el total.

basemipieza_seleccionadas <- basemipieza_inscriptas %>%
   filter(sorteo %in% c(3, 4)) %>%
  group_by(provincia)
basemipieza_seleccionadas_prov <- basemipieza_seleccionadas %>%
  group_by(provincia) %>%
  summarize(
    seleccionadas = n(),
    porcentaje_seleccionadas = round((n() / nrow(basemipieza_seleccionadas) * 100),2))

Visualicemos rápidamente los valores:

basemipieza_seleccionadas_prov %>%
  paged_table(options(rows.print = 25, columns.print = 3))

Ahora que contamos con los datos filtrados y agregados, podemos proceder a realizar la comparación a nivel gráfico. Sin embargo, primero tenemos que hacer cambios a la base para unificar la forma de denominar a las provincias.

basemipieza_seleccionadas_prov <- basemipieza_seleccionadas_prov %>%
    mutate(provincia = ifelse(provincia == "CIUDAD AUTONOMA DE BUENOS AIRES", "CABA", provincia))
library(stringi)
basemipieza_seleccionadas_prov <- basemipieza_seleccionadas_prov %>%
  mutate(
    # Quitar acentos y caracteres especiales sin afectar los espacios
    provincia = gsub("[^a-zA-Z0-9 ]", "", stri_trans_nfkd(provincia)),
    provincia = toupper(provincia),  # Convertir a mayúsculas
    provincia = ifelse(provincia == "CIUDAD AUTONOMA DE BUENOS AIRES", "CABA", provincia)
  )

Con esta modificación hecha, realizaremos un left join que nos permita unificar la base.

mapa_mipieza_seleccionadas <- arg_geom %>%
  right_join(basemipieza_prov, by = "provincia") %>%
  right_join(basemipieza_seleccionadas_prov, by = "provincia")

Con los datos unificados, ahora sí veremos si la base de mujeres encuestadas está distribuida en forma similar a la cantidad de inscriptas. Para ello, agregaremos un último campo, que es el de diferencia, tanto en puntos porcentuales como en términos relativos.

mapa_mipieza_seleccionadas <- mapa_mipieza_seleccionadas  %>%
  mutate(diferencia_final = porcentaje_encuestadas - porcentaje_seleccionadas, 
         diferencia_relativa = round(diferencia_final / porcentaje_seleccionadas * 100, 2)) #Arreglar CABA que sigue figurando como CIUDAD AUTONOMA

Explorando los datos, vemos que las diferencias relativas son importantes en algunas provincias. Sin embargo, es necesario analizar estas diferencias contemplando el tamaño o incidencia que tienen estas provincias en el total de mujeres seleccionadas. En algunos casos, se trata de provincias cuyo peso relativo es de menos del 2%, por lo que es esperable que haya una diferencia importante.

El gráfico con dos coordenadas permitirá mejorar la visualización de esta diferencia al graficar el peso específico que tiene cada provincia.

# Calcular la línea de regresión en función de la variable 'diferencia'
linea_regresion_sel <- lm(diferencia_relativa ~ porcentaje_seleccionadas, data = mapa_mipieza_seleccionadas)

# Crear el gráfico ggplot con los cambios
graf_diferencia_sel <- ggplot(mapa_mipieza_seleccionadas, aes(x = porcentaje_seleccionadas, y = diferencia_relativa)) +
  geom_point_interactive(
    stroke = 1,
    alpha = 0.7,
    aes(
      size = porcentaje_seleccionadas,
      data_id = provincia,
      tooltip = paste0(
        provincia,
        "<br> Diferencia relativa: ", round(diferencia_relativa, 2),
        "<br> % de Seleccionadas: ", round(porcentaje_seleccionadas, 2),
        "<br> % de Encuestadas: ", round(porcentaje_encuestadas, 2)
      )
    )
  ) +
  geom_abline(intercept = coef(linea_regresion_sel)[1], slope = coef(linea_regresion_sel)[2], linetype = "dashed", color = "gray") +
  scale_x_continuous(
    name = "SELECCIONADAS (%)",
    labels = scales::number_format()) +
  scale_y_continuous(
    name = "DIFERENCIA RELATIVA (%)",
    labels = scales::percent_format()
  ) +
  theme_minimal() +
  theme(
    plot.subtitle = element_markdown(size = 10),
    plot.title = element_markdown(size = 14),
    legend.position = "none",
    axis.text.x = element_text(size = 4),
    axis.text.y = element_text(size = 4)
  )+
  scale_fill_distiller(
    palette = "Blues")+
  labs(title = "Análisis de representatividad de la muestra 02",
       subtitle = "Diferencia entre porcentaje de mujeres encuestadas sobre porcentaje de mujeres seleccionadas en cada provincia.")

mapa_mipieza_plot_interactivo_02 <- ggplot(mapa_mipieza_seleccionadas) +
  geom_sf(data=arg_geom, aes(geometry=geometry), color = "#8a8a8a", size=.1, alpha=.1) +
  scale_fill_gradient2(
    low = "#fbffff",
    mid = "#bae0fc",
    high = "#00628d",
    midpoint = 0.5,  # El punto medio en la escala logarítmica
    space = "Lab",
    na.value = "grey50",
    guide = guide_legend(direction = 'horizontal', 
                        title.position = 'top', 
                        title.hjust = 0.5, 
                        label.hjust = 0.5, 
                        keywidth = 1, 
                        keyheight = 1),
    aesthetics = "fill"
  ) + 
  theme_light() +
  theme(title = element_text(face = 'bold'),
        plot.subtitle = element_markdown(size = 10),
        legend.position = 'bottom') +
  geom_sf_interactive(data=arg_geom,aes(tooltip = provincia,
                                   data_id = provincia))

girafe(ggobj = plot_grid(plotlist=list(graf_diferencia_sel, mapa_mipieza_plot_interactivo_02), ncol=2),
       pointsize=12,
       opts_text(size = 12, family = "Helvetica"),
       width_svg = 12,
       height_svg = 12,
       options = list(
         opts_hover_inv(css = "fill:#bae0fc;stroke:#00628d;r:5pt;")))

Como podemos observar, el valor extremo responde a la provincia de La Pampa. Sin embargo, esta es la provincia con menos incidencia respecto de la cantidad de viviendas en BP a nivel país, por lo que la diferencia entre las variables analizadas resulta alta (200%), pero se la atribuye a la sensibilidad a padecer valores extremos que presenta esta provincia dada su poca participación.

Análisis de la representatividad de la muestra respecto a las sorteadas

Por último, analizaremos la representatividad de la muestra de la base de encuestadas de Mi Pieza en función de las mujeres que resultaron sorteadas / seleccionadas por provincia.

Para esto, haremos un gráfico de barras interactivo, pero primero traeremos el valor “porcentaje_encuestadas” de la base “mapa_mipieza”.

basemipieza_renabap <- basemipieza_renabap %>%
  right_join(mapa_mipieza, by = "provincia")
barras_interactivo_03 <- ggplot(basemipieza_renabap)+
  geom_bar(aes(x=provincia, weight=(porcentaje_encuestadas - seleccionadas_porc_prov)), fill="#16425b")+
  labs(title="Diferencia de la participación e/ % encuestadas y % seleccionadas por provincia",
       y="Diferencia entre categoría 'porcentaje_encuestadas' y 'seleccionadas_porc_prov' (pp)",
       x="Provincia",
       caption="Fuente: elaboración propia")+
  geom_label(label = "Provincia", aes(x=provincia, y=(porcentaje_encuestadas - seleccionadas_porc_prov), size = 4, nudge_y = 0.5))+
  coord_flip()+
  theme_light()+
  ggtitle("Diferencia de la participación e/ % hogares y % seleccionadas por provincia") +
  theme(plot.title = element_text(size = 10))  # Ajusta el tamaño del título aquí
## Warning in geom_label(label = "Provincia", aes(x = provincia, y =
## (porcentaje_encuestadas - : Ignoring unknown aesthetics: nudge_y
barras_interactivo_03 <- ggplotly(barras_interactivo_03) #Configurar etiquetas una vez que funcione
## Warning in geom2trace.default(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]): geom_GeomLabel() has yet to be implemented in plotly.
##   If you'd like to see this geom implemented,
##   Please open an issue with your example code at
##   https://github.com/ropensci/plotly/issues
barras_interactivo_03

Analicemos el gráfico en función de sus valores más extremos:

  • Provincias con diferencia en favor del porcentaje de encuestadas. Los valores más extremos los presentan la Provincia de Buenos Aires, con 9,64 pp de diferencia, seguida luego por Santa Fe con solo 0,19 pp. Cabe destacar que en esta variable solo 4 provincias tienen un porcentaje de encuestadas mayor al porcentaje de seleccionadas / sorteadas.
  • Provincias con diferencia en favor del porcentaje de sorteadas / seleccionadas. Los valores más extremos los presentan Salta con 1,90pp, seguida Córdoba, con 1,40.

Conclusiones

A continuación, se buscará responder brevemente a cada pregunta formulada al inicio del ejercicio:

¿Hay un balance entre la cantidad de viviendas en barrios populares por provincia y la cantidad de sorteadas en cada una?

Repasaremos los valores destacados anteriormente.

  • Provincias con diferencia en favor del porcentaje de seleccionadas. Los valores más extremos los presentan la Provincia de Buenos Aires, con 2,42 pp de diferencia, seguida por Corrientes, con 1,35pp.
  • Provincias con diferencia en favor del porcentaje de familias. Los valores más extremos los presentan la Ciudad Autónoma de Buenos Aires (CABA) con 4,35pp, seguida por Tucumán, con 1,14.
  • Provincia sin diferencia. En el caso de Jujuy, la diferencia es de 0,00, aún considerando dos decimales para cada categoría analizada. Esto se constituye en un hallazgo interesante de destacar y que fue analizado tras identificar que en el gráfico, aún con zoom, no se logra identificar una barra.

Sabiendo que las diferencias (en pp) fueron chicas, analizaremos una última variable: el promedio de diferencia entre todas las provincias. Para ello, obviaremos el símbolo de la diferencia, dado que cada una vale en sí misma. Además, calcularemos cuántas observaciones (provincias) tienen valores menores a 1pp.

# Calcular la diferencia y el valor absoluto
basemipieza_renabap$diferencia_abs <- abs(basemipieza_renabap$seleccionadas_porc_prov - basemipieza_renabap$porcentaje_familias)

# Calcular el promedio de la diferencia absoluta
promedio_diferencia <- mean(basemipieza_renabap$diferencia_abs)

# Contar observaciones con diferencias menores a 1 punto porcentual
observaciones_menor_a_1 <- sum(basemipieza_renabap$diferencia_abs < 1)

# Imprimir los resultados
print(paste("El promedio de la diferencia absoluta es:", round(promedio_diferencia, 2)))
## [1] "El promedio de la diferencia absoluta es: 0.59"
print(paste("Número de observaciones con diferencias menores a 1 punto porcentual:", observaciones_menor_a_1))
## [1] "Número de observaciones con diferencias menores a 1 punto porcentual: 20"

Como podemos observar, la diferencia absoluta es, en promedio, muy menor (0,59pp). Esto toma relevancia si se considera que hay muy pocos valores superiores a 1pp, dado que 20 de las 24 jurisdicciones tienen diferencias menores a 1 pp. 

En función de lo anterior, es posible concluir que la distribución entre el porcentaje de seleccionadas para los sorteos de Mi Pieza por provincia y el porcentaje de familias en cada una de ellas es muy homogénea y que existe un balance considerable entre ambas categorías.

¿Existe un balance entre la cantidad de mujeres de la muestra en Mi Pieza y la cantidad de viviendas en barrios populares por provincia?

En cuanto al balance entre la cantidad de mujeres de la muestra analizada del Programa “Mi Pieza” y la cantidad de viviendas en barrios populares por provincia, conviene repasar los valores más extremos, previo a desarrollar la conclusión:

  • Provincias con diferencia en favor del porcentaje de encuestadas. Los valores más extremos los presentan la Provincia de Buenos Aires, con 12,1 pp de diferencia, seguida por Santa Fe, con 1,1pp.
  • Provincias con diferencia en favor del porcentaje de familias. Los valores más extremos los presentan la Ciudad Autónoma de Buenos Aires (CABA) con 4,6pp, seguida por Salta, con 1,3.
  • Provincia sin diferencia. En el caso de La Pampa, la diferencia es de 0,0.

Sabiendo que las diferencias (en pp) fueron chicas, analizaremos una última variable: el promedio de diferencia entre todas las provincias. Para ello, obviaremos el símbolo de la diferencia, dado que cada una vale en sí misma. Además, calcularemos cuántas observaciones (provincias) tienen valores menores a 1pp.

# Calcular la diferencia y el valor absoluto
mapa_completo$diferencia_abs <- abs(mapa_completo$diferencia)

# Calcular el promedio de la diferencia absoluta
promedio_diferencia <- mean(mapa_completo$diferencia_abs)

# Contar observaciones con diferencias menores a 1 punto porcentual
observaciones_menor_a_1 <- sum(mapa_completo$diferencia_abs < 1)

# Imprimir los resultados
print(paste("El promedio de la diferencia absoluta es:", round(promedio_diferencia, 2)))
## [1] "El promedio de la diferencia absoluta es: 1.17"
print(paste("Número de observaciones con diferencias menores a 1 punto porcentual:", observaciones_menor_a_1))
## [1] "Número de observaciones con diferencias menores a 1 punto porcentual: 18"

Como podemos observar, la diferencia absoluta es, en promedio, menor (1,17 pp). Esto toma relevancia si se considera que hay muy pocos valores superiores a 1pp, dado que 18 de las 24 jurisdicciones tienen diferencias menores a 1 pp. 

En función de lo anterior, es posible concluir que la muestra analizada resultó balanceada y representativa en cuanto a las viviendas en barrios populares por provincia, considerando que la diferencia entre el porcentaje de encuestadas en el marco de la muestra de Mi Pieza por provincia y el porcentaje de viviendas (potencial cantidad de beneficiarias) en cada una de ellas es chica y que existe un balance considerable entre ambas categorías. El único valor extremo, que es la Provincia de Buenos Aires, se compensa con las restantes provincias, cuyas diferencias son menores. Además, cabe destacar que el análisis más riguroso se responde con la siguiente pregunta, que hace un análisis más específico en función de las mujeres sorteadas por provincia.

¿Existe un balance entre la cantidad de mujeres de la muestra en Mi Pieza y la cantidad de mujeres que salieron sorteadas por provincia?

Por último, repasaremos los datos vinculados a la cantidad de mujeres de la muestra y la cantidad de mujeres que salieron sorteadas por provincia.

  • Provincias con diferencia en favor del porcentaje de encuestadas. Los valores más extremos los presentan la Provincia de Buenos Aires, con 9,64 pp de diferencia, seguida luego por Santa Fe con solo 0,19 pp. Cabe destacar que en esta variable solo 4 provincias tienen un porcentaje de encuestadas mayor al porcentaje de seleccionadas / sorteadas.
  • Provincias con diferencia en favor del porcentaje de sorteadas / seleccionadas. Los valores más extremos los presentan Salta con 1,90pp, seguida Córdoba, con 1,40

Sabiendo que las diferencias (en pp) fueron relativamente chicas (con la excepción de la Provincia de Buenos Aires), analizaremos una última variable: el promedio de diferencia entre todas las provincias. Para ello, obviaremos el símbolo de la diferencia, dado que cada una vale en sí misma. Además, calcularemos cuántas observaciones (provincias) tienen valores menores a 1pp.

# Calcular la diferencia y el valor absoluto
basemipieza_renabap$diferencia_abs <- abs(basemipieza_renabap$porcentaje_encuestadas - basemipieza_renabap$seleccionadas_porc_prov)

# Calcular el promedio de la diferencia absoluta
promedio_diferencia <- mean(basemipieza_renabap$diferencia_abs)

# Contar observaciones con diferencias menores a 1 punto porcentual
observaciones_menor_a_1 <- sum(basemipieza_renabap$diferencia_abs < 1)

# Imprimir los resultados
print(paste("El promedio de la diferencia absoluta es:", round(promedio_diferencia, 2)))
## [1] "El promedio de la diferencia absoluta es: 0.84"
print(paste("Número de observaciones con diferencias menores a 1 punto porcentual:", observaciones_menor_a_1))
## [1] "Número de observaciones con diferencias menores a 1 punto porcentual: 18"

En función de los análisis anteriores, y tomando como análisis más exacto al último, es posible concluir que la muestra analizada resultó balanceada y representativa. El promedio de la diferencia absoluta entre las variables de interés (porcentaje de encuestadas por provincia y porcentaje de seleccionadas / sorteadas por provincia) es de tan solo 0,84 pp. Además, 18 provincias se encuentran por debajo de la diferencia de 1pp.

Anexo

Obstáculos y desafíos enfrentados durante la implementación

A continuación se enumeran algunos desafíos enfrentados durante la implementación:

  • Uso de múltiples bases de datos. Utilizar bases de distintas procedencias resulta interesante en términos de contribuciones y en cuanto a la ampliación de la información disponible para responder preguntas, pero plantea desafíos vinculados a la estandarización de la denominación de algunos campos. El tiempo invertido en resolver estas diferencias no es menor y conlleva un nivel de detalle y control importante, dado que hay que ir siguiendo la secuencia a lo largo del desarrollo de los chunks para evitar errores en los códigos. Ejemplo: si en un primer momento el campo se llama “name_prov”, y luego se lo modificó a “provincia”, hay que tener un control riguroso del código a partir del cual cualquier nueva utilización de ese campo debe ser con “provincia”.

  • Herramientas de visualización. Las herramientas de visualización son muy potentes por su poder de comunicación y la capacidad que presentan de sintetizar información valiosa. Sin embargo, a lo largo del desarrollo del ejercicio se identificaron desafíos vinculados a la edición de sus variables para generar la mejor visualización posible. Muchas veces la edición fue engorrosa, debido a que en la previsualización que brinda R Studio previo al Knit / HTML no permitía identificar los cambios. Esto devino en la necesidad de hacer correr el modelo a través de un KNIT en reiteradas oportunidades.

  • Archivos generados durante el desarrollo del ejercicio. Debido a los requerimientos específicos de varias herramientas utilizadas en el desarrollo del ejercicio, se debió generar una cantidad grande de bases de datos. Por poner solo un ejemplo, para la utilización del geofacet se debió crear una base específica para cada uno de ellos. Además, en el volumen de bases y variables utilizadas, se perdió algo de control y estandarización en la forma de denominar los campos creados. Por ejemplo, se intentó siempre mantener un criterio que permitira identificar fácilmente los campos y la información que contienen, y en determinados momentos se invirtió esa lógica (de “porcentaje_variale” se pasó a “variable_porc”).

  • Foco en el análisis. Dado que el ejercicio planteó la oportunidad de aprender a usar por primera vez muchas herramientas y funciones, gran parte del tiempo y energía se destino a esto, en detrimento de cierta profundidad de análisis técnico y econométrico de la información.

Aprendizajes y oportunidades de mejora

Mencionados los principales obstáculos y desafíos, se hace hincapié en que, en tanto primer ejercicio de desarrollo extenso, presentó la oportunidad de tener múltiples instancias de “prueba y error” que brindan múltiples oportunidades de mejora para futuros trabajos. Ejemplos de esto son:

  • Mayor control de variables y estandarización de nomenclaturas. Tener mayor control de las variables a utilizar y de su forma de denominación e identificación (nomenclaturas) para evitar perder el criterio en el transcurso del ejercicio. Una buena práctica puede ser tener un documento paralelo en donde se tome nota de las reglas utilizadas para denominar los archivos, a la vez que un registro de las variables más relevantes a controlar.

  • Uso de herramientas ya generadas. Utilizar como base las herramientas de visualización generadas, entendiendo que muchas veces se pretenderá solamente editar los campos de información y no sus aspectos de visualización.

  • Mayor análisis de la infromación. Destinar mayor tiempo al análisis de la información que al aprendizaje sobre el funcionamiento de herramientas y funciones nuevas.

  • Modalidad de trabajo: jornadas extensas e intensivas. Por último, un aprendizaje importante está vinculado a la forma de trabajo con la que me sentí más cómodo. Se prefieren jornadas intesas y largas antes que pequeños períodos de trabajo, en lo que se pierde algo de foco, a la vez que cuesta retomar el hilo y la lógica con la que se realizaron los códigos, las formas de denominar los campos, etc.